#include "databasecreator.h"

#include <QString>
#include <QSqlQueryModel>
#include <QLatin1String>
#include <QStandardPaths>

#define CREATE_AQProdGrupo \
    "(ID_ProdGrupo INTEGER PRIMARY KEY NOT NULL, " \
    "Descricao VARCHAR(50))"

#define CREATE_AQEmpresa \
    "(ID_Empresa INTEGER PRIMARY KEY NOT NULL, " \
    "Nome VARCHAR(50))"

#define CREATE_AQProduto \
    "(ID_Produto INTEGER PRIMARY KEY NOT NULL, " \
    "ID_ProdGrupo INTEGER, " \
    "Descricao VARCHAR(50))"

#define CREATE_AQProdEmpresaInfo \
    "(ID_ProdEmpresaInfo INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Produto INTEGER, " \
    "ID_Empresa INTEGER, " \
    "InfoAtualizacao TIMESTAMP, "\
    "SaldoAtual NUMERIC(13,3), " \
    "Preco1_Data DATE,  Preco1_Valor NUMERIC(13,2), " \
    "Preco2_Data DATE,  Preco2_Valor NUMERIC(13,2), " \
    "Preco3_Data DATE,  Preco3_Valor NUMERIC(13,2) )"

#define CREATE_AQEmbalagemProduto \
    "(ID_EmbalagemProduto INTEGER PRIMARY KEY NOT NULL, " \
    "Descricao VARCHAR(20), " \
    "Unidade VARCHAR(6), " \
    "EAN13DUN14 VARCHAR(14)) "

#define CREATE_AQProdEmbalagem \
    "(ID_ProdEmbalagem INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Produto INTEGER, " \
    "ID_EmbalagemProduto INTEGER)"

#define CREATE_AQFornecedor \
    "(ID_Fornecedor INTEGER PRIMARY KEY NOT NULL, " \
    "Nome VARCHAR(100), " \
    "Endereco VARCHAR(100), " \
    "Bairro VARCHAR(100), " \
    "PosLatitude VARCHAR(30), " \
    "PosLongitude VARCHAR(30), " \
    "Contato VARCHAR(30), " \
    "Tel1 VARCHAR(20), " \
    "Tel2 VARCHAR(20), " \
    "OBS TEXT) "

#define CREATE_TRFORNCOLETA \
    "(ID_FORNCOLETA INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Fornecedor INTEGER, " \
    "DtCarga TIMESTAMP, " \
    "OBS TEXT) "

#define CREATE_TRFORNCOLETAITEM \
    "(ID_FORNCOLETAITEM INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Produto INTEGER, " \
    "ID_FORNCOLETA INTEGER) "

#define CREATE_TRCOLETA \
    "(ID_Coleta INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Fornecedor INTEGER, " \
    "InfoColeta TIMESTAMP, " \
    "ID_FORNCOLETA INTEGER, " \
    "Finalizada CHAR(1) ) "

#define CREATE_TRCOLETAITEM \
    "(ID_ColetaItem INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Produto INTEGER, " \
    "ID_Coleta INTEGER, " \
    "ID_EmbalagemProduto INTEGER, " \
    "Preco NUMERIC(13,2), " \
    "Validade DATE, " \
    "Promocao CHAR(1), " \
    "PromocaoValidade DATE, " \
    "QtdeMinima NUMERIC(13,3), " \
    "QtdeMaxima NUMERIC(13,3), " \
    "Indisponivel CHAR(1), " \
    "Finalizada CHAR(1), " \
    "OBS TEXT)"

#define CREATE_SSPassos \
    "(ID_Passos INTEGER PRIMARY KEY NOT NULL, " \
    "ID_Fornecedor INTEGER, " \
    "Descricao TEXT, " \
    "sistema SMALLINT)"

#define CREATE_SSNotificacao \
    "(ID_Notificacao INTEGER PRIMARY KEY NOT NULL, " \
    "InfoEnvio TIMESTAMP, " \
    "MSG TEXT)"

#define CREATE_SSAnotacao \
    "(ID_Anotacao INTEGER PRIMARY KEY NOT NULL, " \
    "InfoSistema TIMESTAMP, " \
    "Descricao VARCHAR(100), " \
    "MSG TEXT)"

#define CREATE_SSAnotacaoFoto \
    "(ID_Fotografia INTEGER PRIMARY KEY NOT NULL, " \
    "NomeArquivo VARCHAR(30), " \
    "ID_Anotacao INTEGER)"

#define CREATE_SSRastreador \
    "(ID_Rastreador INTEGER PRIMARY KEY NOT NULL, " \
    "InfoSistema TIMESTAMP, " \
    "PosLatitude VARCHAR(30), " \
    "PosLongitude VARCHAR(30), " \
    "PosPrecisao VARCHAR(30))"

#define CREATE_P(nome) {#nome, "create table " #nome CREATE_##nome}
QString createScripts[16][2] =
{
    CREATE_P(AQProdGrupo),
    CREATE_P(AQEmpresa),
    CREATE_P(AQProduto),
    CREATE_P(AQProdEmpresaInfo),
    CREATE_P(AQEmbalagemProduto),
    CREATE_P(AQProdEmbalagem),
    CREATE_P(AQFornecedor),

    CREATE_P(TRFORNCOLETA),
    CREATE_P(TRFORNCOLETAITEM),
    CREATE_P(TRCOLETA),
    CREATE_P(TRCOLETAITEM),

    CREATE_P(SSPassos),
    CREATE_P(SSNotificacao),
    CREATE_P(SSAnotacao),
    CREATE_P(SSAnotacaoFoto),
    CREATE_P(SSRastreador)
};

DatabaseCreator::DatabaseCreator(QObject *parent) :
    QObject(parent)
{
}

QSqlError DatabaseCreator::createDatabase()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    QString dbPath = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
    db.setDatabaseName(dbPath + QDir::separator() + "precolider.sqlite");

    if (!db.open())
        return db.lastError();

    for(int i=0; i<16; i++) {
        QString nome = createScripts[i][0];
        QString sql = createScripts[i][1];

        qDebug("Criando tabela: ");
        qDebug(nome.toUtf8());
        qDebug(sql.toUtf8());

        QSqlQuery query;
        if (!query.exec(sql))
            return query.lastError();
    }


    qDebug("created!");
    return QSqlError();
}

